/* 
 * 中间件模块
 */
// 导入 验证规则 模块
const joi = require('joi')
// 导入 解析Token 中间件
const expressJWT = require('express-jwt')
// 导入全局配置文件
const config = require('../config/index')

// 响应数据中间件
const setCustomResponse = (req, res, next) => {
  /**
   * code = 200 为成功； code = 400 为失败；
   * 默认将 status 的值设置为 400，方便处理失败的情况
   */
  res.cc = function (err, code = 400) {
    res.send({
      code,
      msg: err instanceof Error ? err.message : err
    })
  }
  next()
}

// 错误级别中间件
const handleErrors = (err, req, res, next) => {
  // 数据验证失败
  if (err instanceof joi.ValidationError) return res.cc(err)
  // 身份认证失败
  if (err.name === 'UnauthorizedError') return res.cc('身份认证失败')
  // 未知错误
  res.cc(err)
}

// 解析 Token 中间件
const jwtMiddleware = expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] })

module.exports = {
  setCustomResponse,
  handleErrors,
  jwtMiddleware
}
